use crate::wechat::miniapp::method::{MaQrCodeMethod, WechatMaMethod};
use crate::wechat::miniapp::WechatMaClient;
use crate::{errors::LabraError, request::RequestType, session::SessionStore, LabradorResult};
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};

///<pre>
/// 链接相关操作接口.
///
/// </pre>
/// [文档地址](https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getQRCode.html)
///
#[derive(Debug, Clone)]
pub struct WechatMaUrlLink<'a, T: SessionStore> {
    client: &'a WechatMaClient<T>,
}

#[allow(unused)]
impl<'a, T: SessionStore> WechatMaUrlLink<'a, T> {
    #[inline]
    pub fn new(client: &WechatMaClient<T>) -> WechatMaUrlLink<T> {
        WechatMaUrlLink { client }
    }

    ///
    /// 接口C: 获取小程序页面二维码.
    /// <pre>
    /// 适用于需要的码数量较少的业务场景
    /// 通过该接口，仅能生成已发布的小程序的二维码。
    /// 可以在开发者工具预览时生成开发版的带参二维码。
    /// 带参二维码只有 100000 个，请谨慎调用。
    /// </pre>
    /// [`path`] 扫码进入的小程序页面路径，最大长度 128 字节，不能为空；对于小游戏，可以只传入 query 部分，来实现传参效果，如：传入 "?foo=bar"，即可在 wx.getLaunchOptionsSync 接口中的 query 参数获取到 {foo:"bar"}。
    /// [`width`] 二维码的宽度，单位 px。最小 280px，最大 1280px;默认是430
    pub async fn generate(
        &self,
        data: UrlLinkGenerateRequest,
    ) -> LabradorResult<UrlLinkGenerateResponse> {
        let result = self
            .client
            .post(
                WechatMaMethod::Custom("/wxa/generate_urllink".to_string()),
                vec![],
                &data,
                RequestType::Json,
            )
            .await?;
        let body = result.json::<Value>().expect("转换失败");

        match body["url_link"].as_str() {
            Some(url_link) => Ok(UrlLinkGenerateResponse { url_link: url_link.to_string() }),
            None => {
                return Err(LabraError::ClientError {
                    errcode: body["errcode"].to_string(),
                    errmsg: body["errmsg"].to_string(),
                })
            }
        }
    }
}

//----------------------------------------------------------------------------------------------------------------------------

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UrlLinkGenerateRequest {
    // pub access_token: Option<String>,
    /// 通过 URL Link 进入的小程序页面路径，必须是已经发布的小程序存在的页面，不可携带 query 。path 为空时会跳转小程序主页
    pub path: Option<String>,
    /// 通过 URL Link 进入小程序时的query，最大1024个字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~%
    pub query: Option<String>,
    /// 默认值0.小程序 URL Link 失效类型，失效时间：0，失效间隔天数：1
    pub expire_type: Option<i16>,
    /// 到期失效的 URL Link 的失效时间，为 Unix 时间戳。生成的到期失效 URL Link 在该时间前有效。最长有效期为30天。expire_type 为 0 必填
    pub expire_time: Option<i16>,
    /// 到期失效的URL Link的失效间隔天数。生成的到期失效URL Link在该间隔时间到达前有效。最长间隔天数为30天。expire_type 为 1 必填
    pub expire_interval: Option<i16>,
    /// 默认值"release"。要打开的小程序版本。正式版为 "release"，体验版为"trial"，开发版为"develop"，仅在微信外打开时生效。
    pub env_version: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UrlLinkGenerateResponse {
    /// 生成的小程序 URL Link
    pub url_link: String,
}
